from fastapi import APIRouter, Query, Path, Body
import typing as T

from ..dto.Result import Result
from ..dto.PageParam import PageParam
from ..service.imp.EmpsServiceImp import EmpService
from ..dto.Emp import Emp
from ..utils.Log import Log

router = APIRouter(prefix="/emps", tags=["员工管理相关接口"])


@router.get("", response_model=Result)
async def list(pageParam: T.Annotated[PageParam, Query()], empService: EmpService):
    """

    # 分页和条件查询员工的接口

    ## 接口描述
    该接口用于根据路径参数的条件查询系统中的员工信息，并返回一个标准化的`Result`对象。

    ## 请求方法
    - **HTTP方法**: GET
    - **路径**: `/emps`

    ## 参数说明
    - **pageParam**:
      - 类型: [`PageParam`](file://app/dto/PageParam.py)
      - 描述: 用于描述员工的分页参数对象, 用于描述分页信息。

    ## 返回值
    - **类型**: [`Result`](file://app/dto/Result.py)
    - **字段说明**:
      - `code`: 状态码，表示请求的结果状态。
      - `msg`: 消息，描述请求的结果。
      - `data`: 数据，包含查询到的部门信息列表。
    """
    result = await empService.list(pageParam)
    return Result.success(result)


@Log
@router.delete("/{ids}", response_model=Result)
async def delete(
    ids: T.Annotated[str, Path(description="员工id数组, 逗号分割")],
    empService: EmpService,
):
    """
    # 根据ID列表批量删除员工接口

    ## 接口描述
    该接口用于根据员工ID列表删除指定员工，并返回一个标准化的`Result`对象。

    ## 请求方法
    - **HTTP方法**: DELETE
    - **路径**: `/emps/{ids}`
    ## 参数说明
    - **ids**:
      - 类型: `string`
      - 描述: 员工id列表，标识需要删除的员工。

    ## 返回值
    - **类型**: [`Result`](file://app/dto/Result.py)
    - **字段说明**:
      - `code`: 状态码，表示请求的结果状态。
      - `msg`: 消息，描述请求的结果。
      - `data`: 数据，默认为`None`。

    ## 示例返回值
    ```json
    {
      "code": 1,
      "msg": "success",
      "data": null
    }
    """
    await empService.delete(ids)
    return Result.success()


@Log
@router.post("", response_model=Result)
async def save(
    emp: T.Annotated[Emp, Body(description="员工信息")], empService: EmpService
):
    """
    # 保存员工接口

    ## 接口描述
    该接口用于保存员工信息，并返回一个标准化的`Result`对象。

    ## 请求方法
    - **HTTP方法**: POST
    - **路径**: `/emps`

    ## 参数说明
    - **emp**:
      - 类型: [`Emp`](file://app/dto/Emp.py)
      - 描述: 有id(员工id[可选]), username(用户名), name(姓名), gender(性别), image(头像), job(职位), entrydate(入职日期), deptId(部门id)等字段

    ## 返回值
    - **类型**: [`Result`](file://app/dto/Result.py)
    - **字段说明**:
      - `code`: 状态码，表示请求的结果状态。
      - `msg`: 消息，描述请求的结果。
      - `data`: 数据，默认为`None`。

    ## 示例返回值
    ```json
    {
      "code": 1,
      "msg": "success",
      "data": null
    }
    """
    await empService.save(emp)
    return Result.success()


@router.get("/{id}", response_model=Result)
async def getById(id: T.Annotated[int, Path()], empService: EmpService):
    """
    # 根据ID查询员工接口

    ## 接口描述
    该接口用于根据部门ID查询指定部门信息，并返回一个标准化的`Result`对象。

    ## 请求方法
    - **HTTP方法**: GET
    - **路径**: `/{id}`

    ## 参数说明
    - **id**:
      - 类型: `int`
      - 描述: 员工ID，标识需要查询的员工。

    ## 返回值
    - **类型**: [`Result`](file://app/dto/Result.py)
    - **字段说明**:
      - `code`: 状态码，表示请求的结果状态。
      - `msg`: 消息，描述请求的结果。
      - `data`: 数据，包含查询到的员工信息。
    """
    return Result.success(await empService.getById(id))


@Log
@router.put("", response_model=Result)
async def update(emp: T.Annotated[Emp, Body()], empService: EmpService):
    """
    # 更新部门接口

    ## 接口描述
    该接口用于更新员工信息，并返回一个标准化的`Result`对象。

    ## 请求方法
    - **HTTP方法**: PUT
    - **路径**: `/`

    ## 参数说明
    - **emp**:
      - 类型: [`Emp`](file://app/dto/Emp.py)
      - 描述: 有id(员工id[可选]), username(用户名), name(姓名), gender(性别), image(头像), job(职位), entrydate(入职日期), deptId(部门id)等字段

    ## 返回值
    - **类型**: [`Result`](file://app/dto/Result.py)
    - **字段说明**:
      - `code`: 状态码，表示请求的结果状态。
      - `msg`: 消息，描述请求的结果。
      - `data`: 数据，默认为`None`。

    ## 示例返回值
    ```json
    {
      "code": 1,
      "msg": "success",
      "data": null
    }
    """
    await empService.update(emp)
    return Result.success()
